package unifor.mia.redes.relprotocol;

import java.util.ArrayList;
import java.util.Scanner;

import unifor.mia.redes.relprotocol.channel.Channel;
import unifor.mia.redes.relprotocol.msg.Mensagem;

public class ReliableSender extends ReliableComponent {

	@Override
	public void run() {
		String mensagem = "";
		Scanner input = new Scanner(System.in);
		
		while(true){
			System.out.print(">");
			mensagem = input.nextLine();
			send(mensagem);
		}

	}
	
	public void send(String texto) {
		if (texto == null){
			texto = "";
		}

		ArrayList<Mensagem> bloco = empacota(texto);

		for (Mensagem mensagem : bloco) {
			String confirmation = "";
			while(!confirmation.equals("ACK")) {
				Channel.write(mensagem);
				confirmation = Channel.waitForConfirmation();
			}
		}
	}

	private ArrayList<Mensagem> empacota(String mensagem) {
		
		ArrayList<Mensagem> bloco = new ArrayList<Mensagem>();
		
		int j = 1;
		int ultInd = 0;
		
		if(mensagem == null || mensagem.equals("")){
			 bloco.add(criaMensagem(""));
		} else {
			for(int i=0; i < mensagem.length(); i++){
				if(j == TAMANHO_PACOTE || i == mensagem.length() - 1){
					Mensagem msg = criaMensagem(mensagem.substring(ultInd, i+1));
					bloco.add(msg);
					ultInd = i+1;
					j=1;
				} else {
					j++;
				}
			}
		}		
		bloco.get(0).setStarting();
		bloco.get(bloco.size() - 1).setEnding();
		return bloco;
	}

}
